package com.shm.leetcode;
/**
 * @author: shm
 * @dateTime: 2020/10/30 8:54
 * @description: 463. 岛屿的周长
 * 给定一个包含 0 和 1 的二维网格地图，其中 1 表示陆地 0 表示水域。
 *
 * 网格中的格子水平和垂直方向相连（对角线方向不相连）。整个网格被水完全包围，但其中恰好有一个岛屿（或者说，一个或多个表示陆地的格子相连组成的岛屿）。
 *
 * 岛屿中没有“湖”（“湖” 指水域在岛屿内部且不和岛屿周围的水相连）。格子是边长为 1 的正方形。网格为长方形，且宽度和高度均不超过 100 。计算这个岛屿的周长。
 *
 * 示例 :
 *
 * 输入:
 * [[0,1,0,0],
 *  [1,1,1,0],
 *  [0,1,0,0],
 *  [1,1,0,0]]
 *
 * 输出: 16
 *
 * 解释: 它的周长是下面图片中的 16 个黄色的边：
 */
public class IslandPerimeter {
    /**
     * @author: shm
     * @dateTime: 2020/10/30 9:03
     * @description: 方法一：迭代
     * 思路与算法
     *
     * 对于一个陆地格子的每条边，它被算作岛屿的周长当且仅当这条边为网格的边界或者相邻的另一个格子为水域。
     * 因此，我们可以遍历每个陆地格子，看其四个方向是否为边界或者水域，如果是，将这条边的贡献（即 11）加入答案 \textit{ans}ans 中即可。
     * 复杂度分析
     *
     * 时间复杂度：O(nm)O(nm)，其中 nn 为网格的高度，mm 为网格的宽度。我们需要遍历每个格子，每个格子要看其周围 44 个格子是否为岛屿，因此总时间复杂度为 O(4nm)=O(nm)O(4nm)=O(nm)。
     *
     * 空间复杂度：O(1)O(1)。只需要常数空间存放若干变量。
     *
     * 作者：LeetCode-Solution
     * 链接：https://leetcode-cn.com/problems/island-perimeter/solution/dao-yu-de-zhou-chang-by-leetcode-solution/
     */
    public int islandPerimeter(int[][] grid) {
        int x = grid.length;
        int y = grid[0].length;
        int[][] direction={{1,0},{-1,0},{0,1},{0,-1}};
        int perimeter = 0;
        for(int i=0;i<x;i++){
            for(int j=0;j<y;j++){
                if(grid[i][j]==1){
                    for(int[] d:direction){
                        if(i+d[0]<0||j+d[1]<0||i+d[0]>=x||j+d[1]>=y||grid[i+d[0]][j+d[1]]==0){
                            perimeter++;
                        }
                    }
                }
            }
        }
        return perimeter;
    }


}
